
/**
 * 만든이 : 김진삼
 * 버젼 : 1.0
 * 날짜 : 20130923
 * 이름 siFormValidation
 * --------------------------------
 * 사용법--------------------------
 == 간단 사용법
 	$(document).ready(function() {
		new FormValidate();
	});
 
 input, textarea 태그내에 다음과 같은 attribute를 추가 할 수 있다.
 require	==> 필수로 들어가야 하는 값
 frm="num"	==> 숫자만 허용
 frm="engnum"==> 영어와 숫자만 허용
 frm="eng"	==> 영어만 허용
 max="10"	==> 최대 10글자
 min="5"	==>최소 5글자
 errmsg="최소 5글자, 최대 10글자 이상 입력되어야 합니다."	==> 에러 발생시 나타낼 alert 메시지

 예) require, maxLength = 10, minLength = 5, 에러메시지="최소 5글자, 최대 10글자 까지 입력해주세요."
 <input name="inA" type="text" require max="10" min="5" errmsg="최소 5글자, 최대 10글자 까지 입력해주세요."/>
 
 
 ==추가 사용법
 var _this = this; 
	$(document).ready(function() {
		_this.FormValidate = new FormValidate();
	});
	_this.FormValidate.setClass('에러 발생시 클래스명');	// 디폴트는 border-style:dash;border-color:red;
	
	_this.FormValidate.addUserPattern('함수명', function(val){
			var reg =/\D/gm;	// 숫자가 아닌 경우에
			if(typeof val == 'object') val = $(val).val();	// string이 아닌 object가 넘어오면 해당 value를 가지고 온다.
			if(!val) return false;	// value가 없으면 false 리턴
			var ret = reg.test(val);	// 숫자가 아니면 true 가 ret 에 대입되어 리턴된다.
			return ret;
	});
	함수명은 frm="함수명"과 매칭된다.
 */
var FormValidate = function(){
	
	this.formCloser={};
	this.form=[];
	this.form=$('form');
	this.userPattern={};	// 사용자 등록 pattern 이다. 내부 pattern 보다 우선한다.
	this.pattern={};	// 내부 pattern 이다. 사용자 pattern 보다 후순위다.
	this.bindPattern();
	logs('this.form.length = '+this.form.length);
	if(!this.form||this.form.length==0){
		alert('form 없네!!');
		return;
	}
	for(var i=0;i<this.form.length;i++){
		this.closer(this.form[i], i);	
	}
	
};

/**
 * 이름, callBack function을 넣는다.
 에러 발생시 true가 되도록 함수를 구현해야 한다.
 예)
 this.pattern.num=function(val){
		var reg =/\D/gm;
		if(typeof val == 'object') val = $(val).val();
		if(!val) return false;
		var ret = reg.test(val);
		return ret;
	};
 */
FormValidate.prototype.addUserPattern = function(name, fct){
	this.userPattern[name]=fct;
};

/**
 * 내부 패턴
 */
FormValidate.prototype.bindPattern = function(){
	/**
	숫자만
	*/
	this.pattern.num=function(val){
		var reg =/\D/gm;
		if(typeof val == 'object') val = $(val).val();
		if(!val) return false;
		var ret = reg.test(val);
		return ret;
	};

	/**
	알파벳
	*/
	this.pattern.eng=function(val){
		var reg =/[^a-z]/igm;
		if(typeof val == 'object') val = $(val).val();
		if(!val) return false;
		var ret = reg.test(val);
		return ret;
	};
	
	/**
	알파벳 + 숫자
	*/
	this.pattern.engnum=function(val){
		var reg =/\W/gm;
		logs(typeof val);
		if(typeof val == 'object') val = $(val).val();
		logs(val);
		if(!val) return false;
		var ret = reg.test(val);
		logs(!ret);
		return ret;
	};
};




FormValidate.prototype.closer = function(frm, num){
	var getClass = this.getClass;
	var userPattern = this.userPattern;
	var patternFn = this.pattern;
	var removeErrorCss = this.removeErrorCss;
	frm.onsubmit = function(){
		var ele=null;
		var error = false;
		var result = true;
		for(var j=0;j<frm.elements.length;j++){
			ele = frm.elements[j];
			removeErrorCss(ele);
		}
		for(var j=0;j<frm.elements.length;j++){
			error = false;
			
			ele = frm.elements[j];
			var require = ele.hasAttribute('require');
			var pattern = ele.getAttribute('frm')&&ele.getAttribute('frm').toLowerCase();
			var max = ele.getAttribute('max');	// 최대 값을 가지고 온다.
			if(max){	// 값이 있으면
				if(isNaN(max)){	// 숫자가 아니라면
					max=null;	// null 로 만든다.
				}
			}
			
			var min = ele.getAttribute('min');	// 최소 값을 가지고 온다.
			if(min){	// 값이 있으면
				if(isNaN(min)){	// 숫자가 아니라면
					min=null;	// null 로 만든다.
				}
			}
			
			var errmsg = ele.getAttribute('errmsg');	// 에러 발생시 나타낼 메시지
			
			if(require&&$(ele).val()==0){
				error=true;
			}
			if(pattern && !error){
				if(typeof userPattern[pattern] == 'function'){
					error = userPattern[pattern]($(ele).val());	
				}
			}
			if(pattern && !error){
				if(typeof patternFn[pattern] == 'function'){
					error = patternFn[pattern](ele);
					logs('error = '+error);
				}
			}
			
			if(max){
				if($(ele).val()&&$(ele).val().length>max){
					 error=true;
					 if(!errmsg) alert('최대 '+max+'글자까지 허용됩니다.');	// 설정된 error msg가 없으면 alert을 발생시킨다.
				}
			}
			if(min){
				if($(ele).val()&&$(ele).val().length<min){
					 error=true;
					 if(!errmsg) alert('최소 '+min+'글자까지 허용됩니다.');	// 설정된 error msg가 없으면 alert을 발생시킨다.
				}
			}
			
			if(error){
				getClass(ele);
				$(ele).focus();
				result = false;
				
				if(errmsg) alert(errmsg);
			}
		}
		return result;	
	};	
};
/**
 * class 가지고 오기.
 기본 클래스는 
 .error{
	 border-style:dashed;
	 border-color:red;
	 }
 */
FormValidate.prototype.getClass = function(ele){
	 if(this.css){
		$(ele).addClass(this.css);	 
	 }else{
		 $(ele).css('border-style','dashed').css('border-color','red');	 
	 }
};

FormValidate.prototype.removeErrorCss = function(ele){
	 if(this.css){
		$(ele).removeClass(this.css);	 
	 }else{
		 $(ele).css('border-style',null).css('border-color',null);	 
	 }
};

/**
 * class 변경
 */
FormValidate.prototype.setClass = function(css){
	return this.css=css;
};


